package com.gem.day11;

import java.util.*;

/**
 * 本类用来演示Java集合框架
 * List接口的实现类ArrayList,特点:有序可重复,底层是数组,
 * 所以查询效率高(下标检索),增删效率低
 * 
 * 注意:
 * ArrayList和Vector提供了几乎完全相同的API,底层都是数组,
 * 区别在于ArrayList线程非安全集合类,性能高;Vector是线程安全的集合类,性能低
 * 
 * @author easonsy
 * 2020年7月30日 下午3:00:00
 */
public class ArrayListDemo {
	public static void main(String[] args) {
		//创建集合
		//JDK5.0之前,没有泛型,所以集合中可以存放任意类型的数据,存在数据类型风险
		/*ArrayList list = new ArrayList();
		list.add(5);
		list.add("jack");
		list.add(true);
		list.add(null);*/

		//JDK5.0重构了集合,加入了泛型,泛型的作用就是用来约束集合数据类型
		/*ArrayList<String> list = new ArrayList<String>();
		list.add(5);
		list.add("jack");*/

		//JDK7.0优化
		//注意:集合初始默认空间为10个单位
		List<String> list = new ArrayList<>();
		//末尾添加元素
		list.add("jack");
		list.add("rose");
		list.add("jack");
		//指定位置添加元素
		list.add(1, "tom");

		//清空集合元素
		//list.clear();

		//判断集合中是否包含指定元素
		System.out.println(list.contains("tom"));

		//获取集合元素个数
		System.out.println(list.size());

		//根据下标访问集合元素
		System.out.println(list.get(0));

		//判断集合是否为空
		System.out.println(list.isEmpty());

		//根据下标删除指定元素
		//list.remove(0);

		//根据元素删除[只删除第一次出现的]
		list.remove("jack");

		System.out.println("-------------------------------------");

		//注意:
		//1.
		ArrayList<Integer> list2 = new ArrayList<>();
		list2.add(3);
		list2.add(2);
		list2.add(2);
		list2.add(5);
		list2.add(2);
		//list2.remove(3);//根据下标删除
		//如果就想删除2这个元素如何做?
		//list2.remove(Integer.valueOf(2));//根据元素删除

		//2.删除集合中所有的2
		//错误:删除时,如果两个要被删除的元素时相邻,则第二个元素删除失败
		/*for (int i = 0; i < list2.size(); i++) {
			if (list2.get(i) == 2) {
				list2.remove(i);
			}
		}*/
		//解决方式:反向删除
		for (int i = list2.size() - 1; i >= 0; i--) {
			if (list2.get(i) == 2) {
				list2.remove(i);
			}
		}

		System.out.println(list2);

		System.out.println("-------------------------------------");

		//迭代集合
		//0.JDK8.0
		list.forEach(System.out::println);

		//1.直接打印
		System.out.println(list);

		//2.普通for循环
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}

		//注意:以下两个迭代方法支持无序集合的迭代
		//3.增强for
		for (String s : list) {
			System.out.println(s);
		}

		//4.迭代器
		Iterator<String> iterator = list.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
}
